import expect from "expect"
import Im from "immutable"
import curl from "core/curlify"

describe("curlify", function() {

    it("prints a curl statement with custom content-type", function() {
        var req = {
            url: "http://example.com",
            method: "POST",
            body: {
                id: 0,
                name: "doggie",
                status: "available"
            },
            headers: {
                Accept: "application/json",
                "content-type": "application/json"
            }
        }

        let curlified = curl(Im.fromJS(req))

        expect(curlified).toEqual('curl -X POST http://example.com -H  "Accept: application/json" -H  "content-type: application/json" -d {"id":0,"name":"doggie","status":"available"}')
    })

    it("does not change the case of header in curl", function() {
        var req = {
            url: "http://example.com",
            method: "POST",
            headers: {
                "conTenT Type": "application/Moar"
            }
        }

        let curlified = curl(Im.fromJS(req))

        expect(curlified).toEqual('curl -X POST http://example.com -H  "conTenT Type: application/Moar"')
    })

    it("prints a curl statement with an array of query params", function() {
        var req = {
            url: "http://swaggerhub.com/v1/one?name=john|smith",
            method: "GET"
        }

        let curlified = curl(Im.fromJS(req))

        expect(curlified).toEqual('curl -X GET http://swaggerhub.com/v1/one?name=john|smith')
    })

    it("prints a curl statement with an array of query params and auth", function() {
        var req = {
            url: "http://swaggerhub.com/v1/one?name=john|smith",
            method: "GET",
            headers: {
                authorization: "Basic Zm9vOmJhcg=="
            }
        }

        let curlified = curl(Im.fromJS(req))

        expect(curlified).toEqual('curl -X GET http://swaggerhub.com/v1/one?name=john|smith -H  "authorization: Basic Zm9vOmJhcg=="')
    })

    it("prints a curl statement with html", function() {
        var req = {
            url: "http://swaggerhub.com/v1/one?name=john|smith",
            method: "GET",
            headers: {
                accept: "application/json"
            },
            body: {
                description: '<b>Test</b>'
            }
        }

        let curlified = curl(Im.fromJS(req))

        expect(curlified).toEqual('curl -X GET http://swaggerhub.com/v1/one?name=john|smith -H  "accept: application/json" -d {"description":"<b>Test</b>"}')
    })

    it("handles post body with html", function() {
        var req = {
            url: "http://swaggerhub.com/v1/one?name=john|smith",
            method: "POST",
            headers: {
                accept: "application/json"
            },
            body: {
                description: '<b>Test</b>'
            }
        }

        let curlified = curl(Im.fromJS(req))

        expect(curlified).toEqual('curl -X POST http://swaggerhub.com/v1/one?name=john|smith -H  "accept: application/json" -d {"description":"<b>Test</b>"}')
    })

    it("handles post body with special chars", function() {
        var req = {
            url: "http://swaggerhub.com/v1/one?name=john|smith",
            method: "POST",
            body: {
                description: '@prefix nif:<http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#> .\n' +
                '@prefix itsrdf: <http://www.w3.org/2005/11/its/rdf#> .'
            }
        }

        let curlified = curl(Im.fromJS(req))

        expect(curlified).toEqual('curl -X POST http://swaggerhub.com/v1/one?name=john|smith -d {"description":"@prefix nif:<http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#> .@prefix itsrdf: <http://www.w3.org/2005/11/its/rdf#> ."}')
    })

    it("handles delete form with parameters", function() {
        var req = {
            url: "http://example.com",
            method: "DELETE",
            headers: {
                accept: "application/x-www-form-urlencoded"
            }
        }

        let curlified = curl(Im.fromJS(req))

        expect(curlified).toEqual('curl -X DELETE http://example.com -H  "accept: application/x-www-form-urlencoded"')
    })

    it("should print a curl with formData", function() {
        var req = {
            url: "http://example.com",
            method: "POST",
            headers: { "content-type": "multipart/form-data" },
            body: "id=123&name=Sahar"
        }

        let curlified = curl(Im.fromJS(req))

        expect(curlified).toEqual('curl -X POST http://example.com -H  "content-type: multipart/form-data" -F id=123 -F name=Sahar')
    })

    it("prints a curl post statement from an object", function() {
        var req = {
            url: "http://example.com",
            method: "POST",
            headers: {
                accept: "application/json"
            },
            body: {
                id: 10101
            }
        }

        let curlified = curl(Im.fromJS(req))

        expect(curlified).toEqual('curl -X POST http://example.com -H  "accept: application/json" -d {"id":10101}')
    })

    it("prints a curl post statement from a string containing a single quote", function() {
        var req = {
            url: "http://example.com",
            method: "POST",
            headers: {
                accept: "application/json"
            },
            body: '{"id":"foo\'bar"}'
        }

        let curlified = curl(Im.fromJS(req))

        expect(curlified).toEqual('curl -X POST http://example.com -H  "accept: application/json" -d "{\\"id\\":\\"foo\'bar\\"}"')
    })

})
